#ifndef _FK_APPLICATION_
#define _FK_APPLICATION_

#include <QGuiApplication>

#define fkApp static_cast<FKApplication*>(QGuiApplication::instance())

#define MEW(ClassName) \
int main(int argc,char** argv){ \
    ClassName k(argc,argv); \
    return k.mew(); \
}

#include "FKApplication_global.h"
#include <QStringList>

#include "FKFilesList.h"
#include "FKFileInfo.h"

class FKUserInterface;
class FKAbstractObjectManager;
class FKRoomModule;

enum FKNetState{
    FKLocalState=0,
    FKServerState=1,
    FKClientState=2
};

class FKAPPLICATIONSHARED_EXPORT FKApplication:public QGuiApplication{
    Q_OBJECT
public:
    FKApplication(int &argc, char** argv);
    ~FKApplication();

//    QSize screenSize(); //возвращает размер экрана
//    bool setCSSFromFile(QString &fName); //загружает таблицу стилей из файла
    QMap<QString,QString> langs();
    void restartApplication();
    FKFilesList appVersion(); //возвращает версию приложения

    //runnig new app
    int mew(); //1. выполнить приложение
protected:
    virtual void setup(); //2. первичная настройка (до запуска цикла событий)
    void setDefaults(); //3. настройка оставшихся обязательных параметров
public slots:
    void start(); //4. инициализация (после запуска цикла событий)
    //normal app execution...

signals:
	void processInProgress(int value1, int value2); //сигналы для индикаторов прогресса
	void processMoving(int value1, int value2); //сигналы для индикаторов прогресса
	void processStart(int value1, int value2); //сигналы для индикаторов прогресса
	void processComplete(bool s); //сигналы для индикаторов прогресса
protected:
    void addLang(QString fullName=QString(), QString shortName=QString());
    void setUI(FKUserInterface* ui=0); //установка ЮИ, используется при инициализации
    FKUserInterface* getUI();
    void addPostExecutionCommand(QString command);
    virtual QList<FKFileInfo> initAppVersion(QList<FKFileInfo> ver=QList<FKFileInfo>());
    void refreshAppVersion(QList<FKFileInfo> ver);
private slots:
    void managerRequested(QString managerType, QString ip, int port);
    void resetManager();

    virtual void appFilesReplaceRequested(QStringList fl, QList<quint8> os);
    virtual void requestAppFileUpdate(QString fl, quint8 osType);
    virtual void stopAppFilesDLRequested();

    virtual void fileRecieved(QString fl);
    virtual void bytesRecieved(QString fl, qint64 size);
    virtual void fileRecievingError(QString fl);
private:
    virtual void loadRoomPlugins();
	FKUserInterface* _UI; //ЮИ
    QMap<QString,QString> _langs;
    FKAbstractObjectManager* _manager;
    FKFilesList _appVersion;
    QMap<QString,FKRoomModule*> _roomModules;
};

//#include "FKLogger.h"
//#include <QKeyEvent>
//class Tt:public QObject{
//    Q_OBJECT
//public:
//    Tt():QObject(0){}
//    bool eventFilter(QObject *obj, QEvent *eve){
//        if(eve->type()==QEvent::KeyPress){
//            QKeyEvent* e=static_cast<QKeyEvent*>(eve);
//            FK_MLOGV("key pressed",e->key())
//        }
//        return false;
//    }
//};

#endif
